#include "Channel.h"

Channel::Channel(EventLoop* loop, int fd):loop_(loop),fd_(fd)      //构造函数
{

}

Channel::~Channel()                     //析构函数
{
    //在析构函数中，不要销毁ep_，也不能关闭fd_，因为这两个东西不属于Channel类，Channel类只是需要它们，使用它们而已
}

int Channel::fd()                       //返回fd成员
{
    return fd_;
}

void Channel::useet()                   //采用边缘触发
{
    events_ = events_ | EPOLLET; //设置为边缘触发
}

void Channel::enable_Reading()           //让epoll_wait()监视fd_的读事件
{
    events_ |= EPOLLIN; //读事件
    loop_->ep()->updatechannel(this);
}

//取消读事件
void Channel::disable_Reading()
{
    events_ &= ~EPOLLIN;
    loop_->ep()->updatechannel(this);
}   

//注册写事件
void Channel::enbale_Writing()
{
    events_ |= EPOLLOUT;
    loop_->ep()->updatechannel(this);
}    

//取消写事件
void Channel::disable_Writing()
{
    events_ &= ~EPOLLOUT;
    loop_->ep()->updatechannel(this);
}    

//取消全部的事件
void Channel::disable_All()
{
    events_ = 0;
    loop_->ep()->updatechannel(this);
} 

//从事件循环中删除channel       
void Channel::remove()
{
    disable_All();                      //取消全部的事件循环
    loop_->ep()->removeChannel(this);   //从红黑树上删除fd
}           

void Channel::setinepoll()              //把inepoll_成员的值设置为true
{
    inepoll_ = true;
}

void Channel::setrevents(uint32_t ev)   //把revents_成员的值设置为参数ev
{
    revents_ = ev;
}

bool Channel::inpoll()                  //返回inepoll成员
{
    return  inepoll_;
}

uint32_t Channel::events()              //返回events_成员
{
    return events_;
}

uint32_t Channel::revents()             //返回revents_成员
{
    return revents_;
}

void Channel::handle_Event()            //事件处理函数,epoll_wait()返回的时候调用
{
    if(revents_ & EPOLLRDHUP)//对方已关闭
    {
        // printf("EPOLLRDHUP\n");
        //remove();   //从事件循环中删除Channel
        close_CallBack_();
    }
    else if(revents_ & (EPOLLIN|EPOLLPRI))//有数据可读
    {
        // printf("EPOLLIN|EPOLLPRI\n");
        read_CallBack_();
    }
    else if(revents_ & EPOLLOUT)//有数据需要写
    {
        // printf("EPOLLOUT\n");
        write_CallBack_();
    }
    else    //其他事件,都视为错误
    {
        // printf("OTHER ERROR\n");
        //remove();   //从事件循环中删除Channel
        error_CallBack_();
    }
}

//设置fd_读事件的回调函数
void Channel::set_Read_CallBack(std::function<void()> func) 
{
    read_CallBack_ = func;
}

void Channel::set_Close_CallBack(std::function<void()> func) 
{
    close_CallBack_ = func;
}

void Channel::set_Error_CallBack(std::function<void()> func) 
{
    error_CallBack_ = func;
}

void Channel::set_Write_CallBack(std::function<void()> func) 
{
    write_CallBack_ = func;
}